package org.walkerljl.config;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 配置器<br>
 * <li>Key忽略大小写且默认trim前后空格
 * @author lijunlin
 */
public interface Configurator {
	
	/**
	 * 获取配置信息
	 * @param key 配置Key
	 * @return Object对象
	 */
	Object getProperty(String key);
	
	/**
	 * 获取配置信息
	 * @param key 配置Key
	 * @return Byte对象
	 */
	Byte getPropertyAsByte(String key);
	
	/**
	 * 获取配置信息
	 * @param key 配置Key
	 * @param defaultValue 默认值
	 * @return Byte对象
	 */
	Byte getPropertyAsByte(String key, Byte defaultValue);
	
	/**
	 * 获取配置信息
	 * @param key 配置Key
	 * @return Short对象
	 */
	Short getPropertyAsShort(String key);
	
	/**
	 * 获取配置信息
	 * @param key 配置Key
	 * @param defaultValue 默认值
	 * @return Short对象
	 */
	Short getPropertyAsShort(String key, Short defaultValue);
	
	/**
	 * 获取配置信息
	 * @param key 配置Key
	 * @return Integer对象
	 */
	Integer getPropertyAsInteger(String key);
	
	/**
	 * 获取配置信息
	 * @param key 配置Key
	 * @param defaultValue 默认值
	 * @return Integer对象
	 */
	Integer getPropertyAsInteger(String key, Integer defaultValue);
	
	/**
	 * 获取配置信息
	 * @param key 配置Key
	 * @return Long对象
	 */
	Long getPropertyAsLong(String key);
	
	/**
	 * 获取配置信息
	 * @param key 配置Key
	 * @param defaultValue 默认值
	 * @return Long对象
	 */
	Long getPropertyAsLong(String key, Long defaultValue);
	
	/**
	 * 获取配置信息
	 * @param key 配置Key
	 * @return Float对象
	 */
	Float getPropertyAsFloat(String key);
	
	/**
	 * 获取配置信息
	 * @param key 配置Key
	 * @param defaultValue 默认值
	 * @return Float对象
	 */
	Float getPropertyAsFloat(String key, Float defaultValue);
	
	/**
	 * 获取配置信息
	 * @param key 配置Key
	 * @return Double对象
	 */
	Double getPropertyAsDouble(String key);
	
	/**
	 * 获取配置信息
	 * @param key 配置Key
	 * @param defaultValue 默认值
	 * @return Double对象
	 */
	Double getPropertyAsDouble(String key, Double defaultValue);
	
	/**
	 * 获取配置信息
	 * @param key 配置Key
	 * @return Character对象
	 */
	Character getPropertyAsChar(String key);
	
	/**
	 * 获取配置信息
	 * @param key 配置Key
	 * @param defaultValue 默认值
	 * @return Character对象
	 */
	Character getPropertyAsChar(String key, Character defaultValue);
	
	/**
	 * 获取配置信息
	 * @param key 配置Key
	 * @return Boolean对象
	 */
	Boolean getPropertyAsBoolean(String key);
	
	/**
	 * 获取配置信息
	 * @param key 配置Key
	 * @param defaultValue 默认值
	 * @return Boolean对象
	 */
	Boolean getPropertyAsBoolean(String key, Boolean defaultValue);
	
	/**
	 * 获取配置信息
	 * @param key 配置Key
	 * @return String对象
	 */
	String getPropertyAsString(String key);
	
	/**
	 * 获取配置信息
	 * @param key 配置Key
	 * @param defaultValue 默认值
	 * @return String 对象
	 */
	String getPropertyAsString(String key, String defaultValue);
	
	/**
	 * 获取配置信息
	 * @param key 配置Key
	 * @param regex 分隔符
	 * @return String数组
	 */
	String[] getPropertyAsStringArray(String key, String regex);
	
	/**
	 * 获取配置信息
	 * @param type 数据类型
	 * @param key 配置Key
	 * @param regex 分隔符
	 * @return List<String>对象
	 */
	<T> List<T> getPropertyAsList(Class<T> type, String key, String regex);
	
	/**
	 * 获取配置信息
	 * @param type 数据类型
	 * @param key 配置Key
	 * @param regex 分隔符
	 * @return Set<String>对象
	 */
	<T> Set<T> getPropertyAsSet(Class<T> type, String key, String regex);
	
	/**
	 * 获取配置信息
	 * @param type 数据类型
	 * @param key 配置Key
	 * @param regex 分隔符
	 * @return Map<String, String>对象
	 */
	<T> Map<String, T> getPropertyAsMap(Class<T> type, String key, String regex, String entryRegex);
	
	/**
	 * 获取所有配置信息<br>
	 * <li>返回数据的拷贝
	 * @param key
	 * @return Map<String, Object> key:配置Key,value:配置Value
	 */
	Map<String, Object> getProperties();
	
	/**
	 * 设置配置<br>
	 * <li>覆盖旧配置
	 * @param key
	 * @param value
	 */
	void setProperty(String key, Object value);
	
	/**
	 * 移除
	 * @param key
	 */
	void remove(String key);
	
	/**
	 * 清空
	 */
	void clear();
}